//Game server information
require('./MooTools1.3.2s').apply(GLOBAL);

var api = require('./cabocity.js').api;

/**
 * @name Core
 * @namespace
 * */

/**
 * Conexión a mysql.
 * @type CaboCity.Mysql
 * @memberOf Core#
 * */
exports.mysql = require('./mysqlConnection').newMySQLConnection();

/**
 * Listado de clientes activos del servidor
 * @type CaboCity.Client[]
 * @memberOf Core#
 * */
exports.clientList = [];

/**
 * Siguiente identificador libre para el próximo cliente que se conecte.
 * @private
 * @type Integer
 * @memberOf Core#
 * */
var nextClientId = 0;

/**
 * Listado de mapas activos.
 * @type CaboCity.Map[]
 * @memberOf Core#
 * */
exports.mapList = [];

/**
 * Añade un nuevo comando al sistema.
 * @function
 * @memberOf Core#
 * 
 * @param {CaboCity.Command} commandDef La definición del comando a añadir al sistema.
 * 
 * @return Boolean
 * */
exports.addNewCommand = function(cmdDef){
	
}

/**
 * Lista de definiciones de los comandos.
 * @memberOf {Core#}
 * @type CaboCity.Command[]
 * @private
 * */
var cmdList = [];

/**
* Listado de comandos pendientes de respuesta.
* @memberOf {Core#}
* @type CaboCity.Command[]
* @private
* */
var cmdPending = [];

/**
 * Configura un servidor y hace que escuche.
 * @function
 * @memberOf Core#
 * 
 * @param {CaboCity.configure.ServerOptions} serverOptions Opciones de configuración del servidor.
 * 
 * @return Boolean
 * */
exports.startServer = function(serverOptions){
	if( !serverOptions.isValid() ) {
		console.log("Error al ejecutar el servidor.");
		return false;
	}
	
	io = io.listen(serverOptions.port);
	
	io.sockets.on('connection', function(socket){
		console.log("Nuevo socket creado.");
		
		var client = new api.client.Client(nextClientId, socket );
		exports.clientList[nextClientId] = client;
		nextClientId++;
		
		client.sayHello();
		
		//Receive a command
		socket.on('command', function(command){
			if(!command.r) console.log("Comando inválido.");
			console.log("Nuevo comando.");
			
			var cmdid = command.r;
			var answer = commandList[cmdid].execute(client , command.args);

			answer.send(client);
		});
		
		//Receive an asnwer.
		socket.on('answer', function(a){
		});
		
		socket.on('disconnect', function(){
			console.log("Cliente desconectado y eliminado toda referencia a él.");
			client.disconnect();
			delete exports.clientList[client.id];
		});
	});
	
	return true;
}

/**
 * Almacena la llamada a socket.io
 * @type {Socket-IO}
 * @private
 * @memberOf Core
 * */
var io = require('socket.io');

/**
 * Contiene todas las deficiones.
 * @type CaboCity.def
 * */
exports.def = new (require('./gameInfo')).def();


//TODO check and delete it.
//require('./extensions.js').iniExt(game);
